﻿Imports System.Data.SqlClient


Partial Public Class login
    Inherits System.Web.UI.Page


    'URL a la que redireccionará por defecto si la autentificción
    'es correcta
    Private _WEB_INICIO As String = "/web/codigo/gestionHorariosTeoria.aspx"



    '****************************************************************************************
    '************ PROCEDIMIENTOS AUXILIARES A LOS CONTROLES DE EVENTOS **********************
    '****************************************************************************************

    'Carga los permisos en la variable de sesión 
    Private Sub cargarPermisos(ByVal login As String)     
        Dim conSQLHorarios As SqlConnection
        Dim sqlConsulta As SqlCommand = New SqlCommand()
        Dim drPermisos As SqlDataReader

        Dim activado As Boolean = False
        Dim permisos_acceso As ArrayList = New ArrayList

        Try
            'obtiene la cadena de conexión a la base de datos del fichero Web.config
            conSQLHorarios = New SqlConnection(ConfigurationManager.ConnectionStrings("cnxHorarios").ConnectionString())
            conSQLHorarios.Open()

            sqlConsulta.Connection = conSQLHorarios
            'Consulta con parámetros
            sqlConsulta.CommandText = "SELECT * FROM PERMISOS_USUARIOS WHERE ID_USUARIO=@ID_USUARIO"
            'Configuramos el tipo de comando
            sqlConsulta.CommandType = CommandType.Text

            'Rellenamos el parámtro
            sqlConsulta.Parameters.AddWithValue("@ID_USUARIO", login)

            drPermisos = sqlConsulta.ExecuteReader()


            'Si ha encontrado permisos para el usuario
            If drPermisos.HasRows() Then
                'Lectura adelantada
                drPermisos.Read()

                'si tiene permiso de Consulta de Horarios
                If Not drPermisos("ROL_CONSULTA_HORARIOS_TEORIA") Is DBNull.Value Then
                    activado = Convert.ToBoolean(drPermisos("ROL_CONSULTA_HORARIOS_TEORIA"))
                    If activado Then
                        permisos_acceso.Add(New String("ROL_CONSULTA_HORARIOS_TEORIA"))
                    End If
                End If

            End If

            drPermisos.Close()
            conSQLHorarios.Close()

            Session(Comun._VARIABLE_PERMISOS) = permisos_acceso

        Catch ex As Exception
            Response.Redirect("~/default.aspx")
        End Try

    End Sub

    'Devuelve True si el par usuario-password son correctos. Y false en cualquier otro caso
    Private Function usuario_valido(ByVal usuario As String, ByVal password As String) As Boolean
        Dim conSQLHorarios As SqlConnection
        Dim sqlConsulta As SqlCommand = New SqlCommand()
        Dim drPermisos As SqlDataReader

        Dim passwordTmp As String
        Dim claveSHA512 As String


        Try
            'obtiene la cadena de conexión a la base de datos del fichero Web.config
            conSQLHorarios = New SqlConnection(ConfigurationManager.ConnectionStrings("cnxHorarios").ConnectionString())
            conSQLHorarios.Open()

            sqlConsulta.Connection = conSQLHorarios
            'Consulta con parámetros
            sqlConsulta.CommandText = "SELECT ID_USUARIO, PWD FROM USUARIOS WHERE ID_USUARIO=@ID_USUARIO"
            'Configuramos el tipo de comando
            sqlConsulta.CommandType = CommandType.Text

            'Rellenamos el parámtro
            sqlConsulta.Parameters.AddWithValue("@ID_USUARIO", usuario)

            drPermisos = sqlConsulta.ExecuteReader()


            'Si ha encontrado permisos para el usuario
            If drPermisos.HasRows() Then
                'Lectura adelantada
                drPermisos.Read()

                'si tiene permiso de Consulta de Horarios
                If Not drPermisos("PWD") Is DBNull.Value Then
                    passwordTmp = Convert.ToString(drPermisos("PWD"))
                    claveSHA512 = Comun.generaSHA512(password)

                    Return (claveSHA512.Equals(passwordTmp))
                End If

            End If

            drPermisos.Close()
            conSQLHorarios.Close()

        Catch ex As Exception
            Return False
        End Try

        Return False
    End Function


    '****************************************************************************************



    '****************************************************************************************
    '************ PROCEDIMIENTOS DE CONTROL DE EVENTOS **************************************
    '****************************************************************************************

    Private Sub Login_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles Login.Authenticate
        Dim autenticado As Boolean = False
        Dim dominio As String = String.Empty
        Dim protocolo As String = String.Empty
        Dim destino As String = String.Empty
        Dim subdirectorio As String = String.Empty

        autenticado = usuario_valido(Login.UserName, Login.Password)

        If autenticado Then
            cargarPermisos(Login.UserName)

            dominio = Request.Url.Host
            protocolo = Request.Url.Scheme

            subdirectorio = Comun.sacar_directorio(Request.Url.GetComponents(UriComponents.Path, UriFormat.UriEscaped))

            'Si el protocolo del login es por https, se redirecciona
            'a http automáticamente para que no haya problemas con las cabeceras
            'de https
            If protocolo.Equals("https") Then
                destino = "http://" & dominio & "/" & subdirectorio & _WEB_INICIO
            Else
                destino = "~" & _WEB_INICIO
            End If

            Login.DestinationPageUrl = destino

        Else
            Login.FailureText = "El nombre de usuario o contraseña no coinciden"
        End If

        e.Authenticated = autenticado

    End Sub


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Login.Focus()
    End Sub

End Class